package ar.com.cubika.trainees.date;

import java.util.Date;
import java.util.Iterator;

/**
 * Un objeto que representa un rango de fechas.
 * 
 * @author clombardi
 */
public class RangoDeFechas {
	private Date desde;
	private Date hasta;

	public RangoDeFechas(Date desde, Date hasta) {
		super();
		this.desde = desde;
		this.hasta = hasta;
	}

	/**
	 * True ssi la fecha parametro esta incluida en el rango.
	 */
	public boolean incluye(Date fecha) {
		return (fecha.equals(this.desde) || fecha.after(this.desde))
				&& (fecha.equals(this.hasta) || fecha.before(this.hasta));
	}

	/**
	 * La fecha de inicio del periodo
	 */
	public Date getFechaInicio() {
		return this.desde;
	}

	/**
	 * La fecha de fin del periodo
	 */
	public Date getFechaFin() {
		return this.hasta;
	}

	/**
	 * Un Iterator que itera sobre las fechas del periodo, en orden.
	 * 
	 * @return
	 */
	public Iterator diasIterator() {
		return new RangoIterator(this);
	}

	protected class RangoIterator implements Iterator {
		private RangoDeFechas rango;
		private Date fechaActual;

		public RangoIterator(RangoDeFechas rango) {
			this.rango = rango;
			this.fechaActual = rango.getFechaInicio();
		}

		public void remove() {
			throw new UnsupportedOperationException(
					"no se puede remover sobre un RangoIterator");
		}

		public boolean hasNext() {
			return this.fechaActual.after(rango.getFechaFin());
		}

		public Object next() {
			Date ahora = this.fechaActual;
			this.fechaActual = DateUtils.addDays(this.fechaActual, 1);
			return ahora;
		}

	}

}
